iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 26
2
Modern Web

初探Vue.js 30天系列 第 26

[Day 26] Vue - axios&vSelect 模糊查詢

  • 分享至 

  • xImage
  •  

實作axios+v-select模糊查詢

先前準備安裝套件

在開始前請先安裝v-selectaxioslaravel預設的套件不在另外安裝安裝安裝。

npm install --save-dev vue-select@3.10.5

引用bootstrap

resources/sass,在這支檔案引用bootstrap

@import "node_modules/bootstrap/scss/bootstrap";

新增JS檔

新增search.js檔案,這裡引入一個Component

import Fuzzy from './components/search/Fuzzy.vue';

let app = new Vue({
    el: '#app',
    components: {
        'fuzzy-search': Fuzzy
    },
})

新增Fuzzy Component

引用vue-select.css並建立vue-selectcomponent物件

<template>
	<div id="channel_list">
		<div class="form-group">
			<label>搜尋使用者名稱</label>
			<vSelect v-model="seleted" label="name" :options="searchData" @input="selectedData">
				<span slot="no-options">
					查無資料!
				</span>
			</vSelect>
		</div>
		<div class="form-group" id="select">
			<table class="table table-striped table-bordered" style="width:100%">
				<tr>
					<th>ID</th>
					<th>使用者名稱</th>
					<th>Email</th>
					<th>電話</th>
				</tr>
				<tr v-for="(data, index) in showData" :key="index">
					<th>{{ data.id }}</th>
					<th>{{ data.username }}</th>
					<th>{{ data.email }}</th>
					<th>{{ data.phone }}</th>
				</tr>
			</table>
		</div>
		</div>
</template>

<script>
import 'vue-select/dist/vue-select.css'
import vSelect from 'vue-select'
Vue.component('vSelect', vSelect)

export default {
	data() {
		return {
			btnSelect: 'btn btn-primary',
			url: `https://jsonplaceholder.typicode.com/users`,
			seleted: '',
			showData: []
		}
	},
	computed:{
		searchData() {
			let searchArray = []
			_.findKey(this.showData, function(e, key) {
				searchArray.push(e.username)
			})
			return searchArray
		}
	},
	mounted() {
		this.getDefaultSearchData()
	},
	methods: {
		getDefaultSearchData(){
			this.getApiData(this.url)
		},
		getApiData(url){
			axios.get(url)
			.then(
				response => (
					this.showData = response.data
				)
			)
			.catch(error => {
				console.log(error)
				this.errored = true
			})
		},
		selectedData(){
			if (this.seleted == '' || this.seleted == null) {
				this.getDefaultSearchData()
			}else{
				this.getApiData(this.url+`?username=${this.seleted}`)
			}
		},
	},
}
</script>

先執行mounted()中的getApiData()透過API取得資料後,組到showData陣列裡。
之後searchData(),會組下拉選單的資料,再使用vue-select,把陣列綁定到options選項。
頁面上的下拉選單和表格,就會顯示陣列中的使用者資料。

當下拉選單選擇使用者名稱後,會執行selectedData(),去找使用者的單筆資料。

搜尋頁面

<!-- search.blade.php -->
<html>
    <head>
        <meta name="csrf-token" content="{{ csrf_token() }}">
        <meta http-equiv="Access-Control-Allow-Origin" content="*" />
    </head>

    <body>
        <div class="container">
            <div v-cloak id="app" class="content">
                <form action="" method="POST">
                    {{ csrf_field() }}
                    <h2 
                        id="title" 
                        class="text-center text-black font-weight-bold" 
                        style="margin-bottom:20px;">
                    模糊查詢
                    </h2>
                    <fuzzy-search></fuzzy-search>
                </form>
            </div>
        </div>
        <script src="{{mix('js/app.js')}}"></script>
        <script src="{{mix('js/search.js')}}"></script>
        <link rel="stylesheet" type="text/css" href="{{mix('/css/app.css')}}">
    </body>

</html>

設定Routes

Route::get('/search', function () {
    return view('search');
});

編譯檔案

上面步驟完成之後,我們要進行編譯,請在webpack.mix.js檔案,新增search.jsapp.sass檔案

mix.js('resources/js/app.js', 'public/js')
   .js('resources/js/search.js', 'public/js')
    .sass('resources/sass/app.scss', 'public/css');

做完之後,執行編譯指令

npm run watch

啟動本機站台

$ php artisan serve
Starting Laravel development server: http://127.0.0.1:8000

啟動之後,輸入網址為http://127.0.0.1:8000/search

流程

畫面載入時,系統透過API抓使用者全部資料,並顯示在列表上,下拉選單則是顯示全部使用者姓名。
選擇後,系統會偵測選到的使用者姓名,更新列表與下拉選單。/images/emoticon/emoticon08.gif

Resource
jsonplaceholder


上一篇
[Day 25] Vue.js - 台灣縣市選擇器
下一篇
[Day 27] Vue 商品&信用卡
系列文
初探Vue.js 30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言